package internal

import "me.code/go_lc/pkg"

/**
给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头
*/

// 逆序,个位数在最前面.
// 链表形式两数相加.
func addTwoNumbers(l1 *pkg.ListNode, l2 *pkg.ListNode) *pkg.ListNode {
	// 和以前做加法的时候类似,
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}

	var num1, num2, carry int = 0, 0, 0
	head := &pkg.ListNode{}
	var tail *pkg.ListNode
	// 循环两个链表,只要有一个不为空,就接着循环.空的用0补齐.
	for l1 != nil || l2 != nil {

		if l1 == nil {
			num1 = 0
		} else {
			l1 = l1.Next
		}

		if l2 == nil {
			num2 = 0
		} else {
			l2 = l2.Next
		}

		now := (num1 + num2 + carry) % 10
		// 尾插法.
		if tail == nil {
			tail = &pkg.ListNode{}
			head.Next = tail
			tail.Val = now
		} else {
			tail.Next = &pkg.ListNode{
				Val: now,
			}
			tail = tail.Next
		}

		// 更新carry的值.
		carry = (num1 + num2 + carry) / 10
	}

	if carry >= 0 {
		// 将carry放在新的节点上.
		tail.Next = &pkg.ListNode{
			Val: carry,
		}
	}

	return head.Next
}
